package main

import "fmt"




//题目1：以下代码输出什么？
func Foo(x interface{}) {
    if x == nil {
        fmt.Println("empty interface")
        return
    }
    fmt.Println("non-empty interface")
}

func timu1() {
    var x []int32 = nil
    Foo(x)
}
//--------------------------------------------------------
//题目二，ABCD哪一行出错
type S struct {
}

func f(x interface{}) {
}

func g(x *interface{}) {
}

func timu2() {
    s := S{}
    p := &s
    f(s) //A    f(x interface{})可以接受任何类型
    //g(s) //B    g(x *interface{})只能接受 *interface类型
    f(p) //C
    //g(p) //D    g(x *interface{})只能接受 *interface类型
}
//题目3：以下代码输出内容
func timu3() {

    type A interface{}
    type B struct{}
    var a *B
    // interface表示可以理解为(type, value), 当(type, value) = (nil,nil)时，则表示interface为nil
    //fmt.Printf("a:%T,  (*B)(nil): %T,  A(nil): %T,  A(a):%T,  nil: %T\n",
        //a, (*B)(nil), A(nil), A(a), nil) //
    fmt.Println("1", a == nil)                //true, 非interface类型和nil比较
    fmt.Println("2", a == (*B)(nil))          //true， 非interface类型和nil比较
    fmt.Println("3", a == A(nil))             // false, 非interface类型和interface的nil比较

    fmt.Println("4", A(a) == nil)       // false,A(a) = (*B, nil) != (nil, nil)
    fmt.Println("5", A(a) == (*B)(nil)) //true, A(a) = (*B, nil) == (*B, nil)
    fmt.Println("6", A(a) == A(nil))    //false, A(a) = (*B, nil) != (nil, nil)

}

//题目4：以下代码打印什么
type People interface {
    Show()
}

type Student struct{}

func (stu *Student) Show() {

}

func live() People {
    var stu *Student
    return stu
}

func timu4() {
    if live() == nil {
        fmt.Println("AAAAAAA")
    } else {
        fmt.Println("BBBBBBB")
    }
}

func main() {
    fmt.Printf("题目1结果：\n")
    timu1()

    fmt.Printf("----------------------------------\n题目2结果：\n")
    timu2()

    fmt.Printf("----------------------------------\n题目3结果：\n")
    timu3()

    fmt.Printf("----------------------------------\n题目4结果: \n")
    timu4()
}
